打印出 hello world
只是我们学习Python的第一步,但是仅仅打印出 hello world
肯定不能满足我们的需求,你可能会希望做得更多,比如写一个小脚本帮你抢火车票,接下来我们会介绍一些基本概念。
注释
任何时候,我们都可以给程序加上注释来解释代码,这样当自己或别人阅读的时候可以很容易的理解你的程序是做什么的。而程序运行的时候,Python解释器会直接忽略掉所有的注释。虽然有没有注释都不影响程序的执行结果,但是影响到别人能不能看懂你的代码。
Python的注释以#
开头,后面的文字直到行尾都算注释
举个例子:
1 | print('hello world') #注意到 print 是一个函数 |
或者:
1 | # 注意到 print 是一个函数 |
你应该在你的程序中尽可能多地使用 有用 的注释:
- 解释假设
- 说明重要的决定
- 解释重要的细节
- 说明你想要解决的问题
- 说明你想要在程序中克服的问题,等等。
缩进
Python的一个与众不同之处是,使用缩进来 标识代码块。要在Python中标识代码块,必须以同样程度缩进代码块的每一行。在其他大多数编程语言中,缩进只用于让代码更美观;但在Python中,必须使用缩进来指出语句所属的代码块。
下面是一个例子:
1 | i = 5 |
当你运行这一程序时,你将得到如下错误:
1 | File "whitespace.py", line 3 |
提示 缩进量很重要,在Python语句块中,多一个或少一个空格都可能导致错误或意外行为。在同一个代码块中,所有语句的缩进量必须相同。
提示
Python 语言官方的建议使用四个空格来缩进。
标识符命名
标识符(Identifiers) 是为 某些东西 提供的给定名称,比如变量,函数、模块和类等。在你命名标识符时,你需要遵守以下规则:
- 第一个字符必须是字母或下划线(
_
)。 - 标识符的其它部分可以由字母、下划线(
_
)、数字(0~9)组成。 - 标识符名称区分大小写。例如,
myname
和myName
并不等同。 - 不能将Python关键字用作变量名。例如,
if
、else
、while
、def
、or
、and
、not
、in
和is
都是Python关键字。
合法和非法的变量名
合法变量名 | 非法变量名 |
---|---|
M | m |
x1 | 1x |
tax_rate | tax rate |
taxRate | taxRate! |
Else | else |
变量
在Python中,变量的概念基本上和初中代数的方程变量是一致的。
例如,对于方程式 y=x*x
,x
就是变量。当x=2
时,计算结果是4
,当x=5
时,计算结果是25
。
只是在计算机程序中,变量不仅可以是数字,还可以是任意数据类型。
比如:
1 | a = 1 |
变量a
是一个整数。
1 | b = 'T007' |
变量b
是一个字符串。
1 | c = True |
变量c
是一个布尔值True
。
变量名的命名规则参考 标识符命名。
常量
常量就是不能改变的变量,比如数学常数π就是一个常量。在Python中,通常用全部大写的变量名表示常量:
1 | PI = 3.14 |
但事实上PI
仍然是一个变量,Python根本没有任何机制保证PI
不会被改变,只能由我们自己保证,如果我们不小心改变了常量的值将会导致意想不到的错误。
字面常量(Literal Constants)—— 故名思议就是它字面意义上的值或是内容,比如 5
、1.23
这样的数字,或者是如 'This is a string'
这样的文本。
基本数据类型
计算机顾名思义就是可以做数学计算的机器,因此,计算机程序理所当然地可以处理各种数值。但是,计算机能处理的远不止数值,还可以处理文本、图形、音频、视频、网页等各种各样的数据,不同的数据,需要定义不同的数据类型。下面将介绍几种基本的数据类型。
整数
整数是不带小数部分的数字,如25
、-86
和 0
。
Python对整数的长度没有限制,你可以执行数十位甚至数百数千位的整数运算
1 | 27 ** 100 |
针对有经验的程序员的提示
没有单独的
long
类型。int
类型可以指任何大小的整数。
浮点数
在Python中,浮点数是带小数点的数字,例如 3.23
或 52.3E4
。其中,E
表示 10 的幂。在这里,52.3E4
表示 52.3 * 10^4
。
与整数不同,浮点数存在上限和下限,超出上限或下限将导致溢出错误。溢出错误意味着计算结果太大或太小,Python无法将其表示为浮点数。面对溢出错误,Python可能沉默不语,即继续执行错误的计算,而不告诉你出了问题。一般而言,避免溢出错误的职责由程序员承担。
1 | 500.0 ** 10000 |
无论在哪种计算机上,浮点数都可能存在精度损失。在计算机中,数字用二进制(基数为2)表示,但并非所有浮点数都可用二进制精确地表示。例如:
1 | 1 - 2 / 3 |
结果应该是小数点后面有无穷个3,但这里只包含17位。另外,最后一位也不对——应该是3而不是7。
提示 一般而言,应优先考虑使用整数而不是浮点数,因为它们更精确且绝不会溢出。
字符串
字符串是一系列字符,如"cat!"
、"567-45442"
和"Up and Down"
。字符包括字母、数字、标点符号以及数百个其他的特殊符号和不可打印的字符。
表示字符串字面量
在Python中,可使用下列3种主要方式来表示字符串字面量。
- 单引号,如
'openhouse'
。 - 双引号,如
"What's your name?"
。 - 三引号,
"""http"""
或'''http'''
来指定多行字符串。
提示 单引号和双引号的一个主要用途是,让你能够在字符串中包含字符
"
和'
。
1
2
3 > "It's great"
> 'She said "Yes!"'
>提示 在需要创建多行的长字符串时,三引号很有用。在使用三引号括起的字符串中,还可包含字符
"
和'
。
1
2
3
4
5
6 > '''这是一段多行字符串。这是它的第一行。
> 这是它的第二行.
> "What's your name?," I asked.
> He said "Bond, James Bond."
> '''
>提示
''
、""
、"""
或'''
本身只是一种表示方式,不是字符串的一部分
转义字符
并非所有字符都有可视的标准符号。例如,换行字符、回车字符和制表符都是不可见的,虽然它们带来的效果可见。这些字符属于空白字符——在印刷页面上显示为空白。
为处理空白字符以及其他不可打印的字符,Python使用一种特殊表示法——转义字符。下表列出了最常用的转义字符。
字符 | 含义 |
---|---|
\\ |
反斜杠 |
\' |
单引号 |
\" |
双引号 |
\n |
换行符 |
\r |
回车 |
\t |
水平制表符 |
要在字符串中包含反斜杠、单引号和双引号,通常需要使用对应的转义字符。例如:
1 | '\' and \" are quotes') print( |
在Python中,表示换行的标准方式是使用字符\n
:
1 | 'one\ntwo\nthree') print( |
提示 转义字符是单个字符,只是为让Python知道下一个字符是特殊字符,所以必须使用
\
,但在计算字符串的长度时,并不将\
视为额外的字符。
原始字符串
如果你需要指定一些未经过特殊处理的字符串,比如转义序列,那么你需要在字符串前增加 r
或 R
来指定一个 原始(Raw) 字符串。下面是一个例子:
1 | '\\\t\\') print( |
针对正则表达式用户的提示
在处理正则表达式时应全程使用原始字符串。否则,将会有大量 Backwhacking 需要处理。
举例说明的话,反向引用可以通过
'\\1'
或r'\1'
来实现。针对 C/C++ 程序员的提示
Python 中没有单独的
char
数据类型,它并非切实必要。针对 Perl/PHP 程序员的提示
记住单引号括起的字符串和双引号括起的字符串是一样的——它们不存在任何区别。
布尔值
布尔值和布尔代数的表示完全一致,一个布尔值只有True
、False
两种值,要么是True
,要么是False
,在Python中,可以直接用True
、False
表示布尔值(请注意大小写),也可以通过布尔运算计算出来。
1 | True |
空值
空值是Python里一个特殊的值,用None
表示。None
不能理解为0
,因为0
是有意义的,而None
是一个特殊的空值。
赋值语句
赋值语句包含3个主要部分:左值、赋值运算符和右值。如下图所示
提示 左值必须是变量,而右值可以是变量、值或结果为值的任何表达式。
赋值语句有两个用途:
- 定义新的变量;
- 让已定义的变量指向特定值。
例如:
1 | 5 x = |
第一条赋值语句(x = 5
)完成了两项职责,是一条初始化语句。它让Python创建新变量x
,并将值5赋给它。然后,在可以使用整数的任何地方,都可使用变量x
了。
第二条赋值语句(x = ABC
)给x
重新赋值,让它指向另一个值。它没有创建变量x
,因为这个变量已经存在,这是前一条赋值语句的功劳。
针对 C/C++ 程序员的提示
Python 是动态语言,变量本身类型不固定的,所以同一个变量可以反复赋值,而且可以是不同类型。C/C++ 是静态语言。静态语言在定义变量时必须指定变量类型,如果赋值的时候类型不匹配,就会报错。
变量如何引用值
对于x = expr
这样的Python赋值语句,可以这样解读:让x指向表达式expr的值。expr
可以是任何结果为值的Python表达式。
为帮助理解一系列赋值语句,一种不错的方式是绘制示意图。
例如:
1 | 'ABC' x = |
执行语句 x = 'ABC'
后,可以认为计算机的内存类似于图1所示。接下来,执行语句 y = x
后,计算机内存类似于图2所示。最后,执行语句 x = '123'
后,计算机内存类似于图3所示。
对于没有任何变量指向的值,Python自动将其删除。一般而言,Python跟踪所有的值,并自动删除不再有变量指向的值。这称为垃圾收集,因此Python程序员很少需要为删除值操心。
赋值时不复制
赋值语句并不会复制指向的值,而只是标记和重新标记既有值。因此,无论变量指向的对象有多大、多复杂,赋值语句的效率都非常高。
数字和字符串是不可变的
在Python中,数字和字符串的一个重要特征是不可变,即不能以任何方式修改它们。在看起来是修改数字或字符串的情况下,Python实际上是在创建修改版本的拷贝。
1 | 'apple' s = |
多重赋值
在Python中,有一种便利的技巧,让你能够同时给多个变量赋值:
1 | 1, 'two', 3.0 x, y, z = |
还可以在一行显示多个值,方法是将它们作为元组。元组总是以左圆括号(
开始,以右圆括号)
结尾。
交换变量的值
多重赋值的一个很实用的用途是交换两个变量的值:
1 | 5, 9 a, b = |
语句a, b = b, a
的含义是,同时给变量a
和b
赋值。
如果不使用多重赋值,将两个变量的值互换的标准方式如下:
1 | 5, 9 a, b = |
多重赋值的功能并不比常规赋值多,它只是一种偶尔使用的比较便利的快捷方式。
对象
需要记住的是,Python 将程序中的任何内容统称为 对象(Object)。这是一般意义上的说法。我们以“某某对象(object)”相称,而非“某某东西(something)”。
针对面向对象编程语言用户的提示:
Python 是强(Strongly)面向对象的,因为所有的一切都是对象, 包括数字、字符串与函数。